#include "widget.h"
#include "ui_widget.h"
#include <QApplication>
#include <QStyle>
#include <QDateTime>
#include <QDebug>
#include <QMessageBox>
#include <QSslConfiguration>
#include <QSslSocket>
#include <QTimer>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    , networkManager(nullptr)
    , chatDisplay(nullptr)
    , messageInput(nullptr)
    , sendButton(nullptr)
    , clearButton(nullptr)
    , statusLabel(nullptr)
    , isWaitingForResponse(false)
{
    // 设置API密钥
    apiKey = "sk-1c50d590f7c249268f7777a44057911b";
    
    // 初始化界面
    setupUI();
    
    // 初始化网络管理器
    setupNetwork();
    
    // 设置样式
    setupStyle();
    
    // 设置窗口标题和大小
    setWindowTitle("智能问答助手 - DeepSeek AI");
    resize(800, 600);
    
    // 连接信号和槽
    connect(sendButton, &QPushButton::clicked, this, &Widget::sendMessage);
    connect(clearButton, &QPushButton::clicked, this, &Widget::clearHistory);
    connect(messageInput, &QLineEdit::returnPressed, this, &Widget::handleReturnPressed);
    
    // 检查SSL支持状态并显示相应的欢迎消息
    if (QSslSocket::supportsSsl()) {
        qDebug() << "SSL支持正常，版本:" << QSslSocket::sslLibraryVersionString();
        addMessage("欢迎使用智能问答助手！我是基于DeepSeek AI的智能助手，请问有什么可以帮助您的吗？", false);
    } else {
        qDebug() << "SSL支持异常，请检查OpenSSL配置";
        addMessage("欢迎使用智能问答助手！", false);
        addMessage("⚠️ 当前处于演示模式：SSL支持不可用，将使用模拟响应进行功能演示。", false);
        addMessage("💡 要使用真实的DeepSeek AI功能，请确保Qt环境支持OpenSSL。您仍然可以体验完整的界面功能！", false);
    }
}

Widget::~Widget()
{
    delete ui;
}

// 初始化界面
void Widget::setupUI()
{
    // 创建主布局
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    
    // 创建标题标签
    QLabel *titleLabel = new QLabel("🤖 智能问答助手");
    titleLabel->setAlignment(Qt::AlignCenter);
    titleLabel->setStyleSheet("font-size: 18px; font-weight: bold; color: #2c3e50; margin: 10px;");
    mainLayout->addWidget(titleLabel);
    
    // 创建对话显示区域
    chatDisplay = new QTextEdit();
    chatDisplay->setReadOnly(true);
    chatDisplay->setMinimumHeight(400);
    chatDisplay->setStyleSheet(
        "QTextEdit {"
        "   background-color: #f8f9fa;"
        "   border: 2px solid #e9ecef;"
        "   border-radius: 10px;"
        "   padding: 10px;"
        "   font-size: 14px;"
        "   color: #495057;"
        "}"
    );
    mainLayout->addWidget(chatDisplay);
    
    // 创建状态标签
    statusLabel = new QLabel("就绪");
    statusLabel->setAlignment(Qt::AlignCenter);
    statusLabel->setStyleSheet("color: #6c757d; font-size: 12px; margin: 5px;");
    mainLayout->addWidget(statusLabel);
    
    // 创建输入区域布局
    QHBoxLayout *inputLayout = new QHBoxLayout();
    
    // 创建消息输入框
    messageInput = new QLineEdit();
    messageInput->setPlaceholderText("请输入您的问题...");
    messageInput->setStyleSheet(
        "QLineEdit {"
        "   border: 2px solid #dee2e6;"
        "   border-radius: 20px;"
        "   padding: 10px 15px;"
        "   font-size: 14px;"
        "   background-color: white;"
        "}"
        "QLineEdit:focus {"
        "   border-color: #007bff;"
        "   outline: none;"
        "}"
    );
    inputLayout->addWidget(messageInput);
    
    // 创建发送按钮
    sendButton = new QPushButton("发送");
    sendButton->setStyleSheet(
        "QPushButton {"
        "   background-color: #007bff;"
        "   color: white;"
        "   border: none;"
        "   border-radius: 20px;"
        "   padding: 10px 20px;"
        "   font-size: 14px;"
        "   font-weight: bold;"
        "}"
        "QPushButton:hover {"
        "   background-color: #0056b3;"
        "}"
        "QPushButton:pressed {"
        "   background-color: #004085;"
        "}"
        "QPushButton:disabled {"
        "   background-color: #6c757d;"
        "}"
    );
    inputLayout->addWidget(sendButton);
    
    // 创建清空按钮
    clearButton = new QPushButton("清空");
    clearButton->setStyleSheet(
        "QPushButton {"
        "   background-color: #6c757d;"
        "   color: white;"
        "   border: none;"
        "   border-radius: 20px;"
        "   padding: 10px 20px;"
        "   font-size: 14px;"
        "   font-weight: bold;"
        "}"
        "QPushButton:hover {"
        "   background-color: #545b62;"
        "}"
        "QPushButton:pressed {"
        "   background-color: #3d4449;"
        "}"
    );
    inputLayout->addWidget(clearButton);
    
    mainLayout->addLayout(inputLayout);
    
    // 设置主布局
    setLayout(mainLayout);
}

// 初始化网络管理器
void Widget::setupNetwork()
{
    networkManager = new QNetworkAccessManager(this);
    connect(networkManager, &QNetworkAccessManager::finished, this, &Widget::handleApiResponse);
    
    // 配置SSL设置以解决TLS初始化失败问题
    QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
    sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
    sslConfig.setProtocol(QSsl::TlsV1_2);
    QSslConfiguration::setDefaultConfiguration(sslConfig);
    
    qDebug() << "SSL配置已设置，支持的协议:" << QSslSocket::supportsSsl();
}

// 设置样式
void Widget::setupStyle()
{
    // 设置窗口背景色
    setStyleSheet(
        "QWidget {"
        "   background-color: #ffffff;"
        "   font-family: 'Microsoft YaHei', Arial, sans-serif;"
        "}"
    );
}

// 发送消息
void Widget::sendMessage()
{
    QString message = messageInput->text().trimmed();
    if (message.isEmpty()) {
        return;
    }
    
    if (isWaitingForResponse) {
        QMessageBox::information(this, "提示", "正在等待AI回复，请稍候...");
        return;
    }
    
    // 添加用户消息到对话区域
    addMessage(message, true);
    
    // 清空输入框
    messageInput->clear();
    
    // 发送API请求
    sendApiRequest(message);
}

// 处理回车键发送
void Widget::handleReturnPressed()
{
    sendMessage();
}

// 发送API请求
void Widget::sendApiRequest(const QString &message)
{
    // 设置等待状态
    isWaitingForResponse = true;
    sendButton->setEnabled(false);
    statusLabel->setText("正在思考中...");
    
    // 检查SSL支持状态
    if (!QSslSocket::supportsSsl()) {
        // SSL不支持，使用模拟响应进行演示
        qDebug() << "SSL不支持，使用模拟响应";
        statusLabel->setText("使用模拟响应（SSL不可用）");
        
        // 创建一个定时器来模拟网络延迟
        QTimer::singleShot(1000, this, [this, message]() {
            QString response = generateMockResponse(message);
            addMessage(response, false);
            
            // 重置状态
            isWaitingForResponse = false;
            sendButton->setEnabled(true);
            statusLabel->setText("就绪（模拟模式）");
        });
        return;
    }
    
    // 创建请求URL
    QUrl url("https://api.deepseek.com/chat/completions");
    
    // 创建网络请求
    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    request.setRawHeader("Authorization", QString("Bearer %1").arg(apiKey).toUtf8());
    
    // 配置SSL设置
    request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork);
    request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
    
    // 设置SSL配置
    QSslConfiguration sslConfig = request.sslConfiguration();
    sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
    request.setSslConfiguration(sslConfig);
    
    // 构建请求数据
    QJsonObject requestData;
    requestData["model"] = "deepseek-chat";
    requestData["stream"] = false;
    
    // 添加对话历史
    QJsonArray messages;
    messages.append(QJsonObject{{"role", "system"}, {"content", "你是一个有用的AI助手，请用中文回答用户的问题。"}});
    
    // 添加历史对话
    for (const QJsonValue &value : conversationHistory) {
        messages.append(value.toObject());
    }
    
    // 添加当前用户消息
    messages.append(QJsonObject{{"role", "user"}, {"content", message}});
    
    requestData["messages"] = messages;
    
    // 发送请求
    QJsonDocument doc(requestData);
    networkManager->post(request, doc.toJson());
}

// 处理API响应
void Widget::handleApiResponse(QNetworkReply *reply)
{
    // 重置状态
    isWaitingForResponse = false;
    sendButton->setEnabled(true);
    
    if (reply->error() == QNetworkReply::NoError) {
        QByteArray data = reply->readAll();
        QString response = parseApiResponse(data);
        
        if (!response.isEmpty()) {
            addMessage(response, false);
            statusLabel->setText("就绪");
        } else {
            statusLabel->setText("解析响应失败");
            addMessage("抱歉，我无法理解您的请求，请重试。", false);
        }
    } else {
        handleNetworkError(reply->error());
    }
    
    reply->deleteLater();
}

// 处理网络错误 - 简化版本
void Widget::handleNetworkError(QNetworkReply::NetworkError error)
{
    QString errorMessage;
    
    // 简化的错误处理，只处理最基本的网络错误类型
    switch (error) {
        case QNetworkReply::ConnectionRefusedError:
            errorMessage = "连接被拒绝，请检查网络连接";
            break;
        case QNetworkReply::RemoteHostClosedError:
            errorMessage = "远程服务器关闭连接";
            break;
        case QNetworkReply::HostNotFoundError:
            errorMessage = "找不到服务器";
            break;
        case QNetworkReply::TimeoutError:
            errorMessage = "请求超时";
            break;
        case QNetworkReply::OperationCanceledError:
            errorMessage = "操作被取消";
            break;
        case QNetworkReply::SslHandshakeFailedError:
            errorMessage = "SSL握手失败";
            break;
        case QNetworkReply::TemporaryNetworkFailureError:
            errorMessage = "临时网络故障";
            break;
        case QNetworkReply::NetworkSessionFailedError:
            errorMessage = "网络会话失败";
            break;
        case QNetworkReply::BackgroundRequestNotAllowedError:
            errorMessage = "后台请求不被允许";
            break;
        case QNetworkReply::TooManyRedirectsError:
            errorMessage = "重定向次数过多";
            break;
        case QNetworkReply::InsecureRedirectError:
            errorMessage = "不安全的重定向";
            break;
        case QNetworkReply::UnknownNetworkError:
            errorMessage = "未知网络错误";
            break;
        case QNetworkReply::ProxyConnectionRefusedError:
            errorMessage = "代理连接被拒绝";
            break;
        case QNetworkReply::ProxyConnectionClosedError:
            errorMessage = "代理连接关闭";
            break;
        case QNetworkReply::ProxyNotFoundError:
            errorMessage = "找不到代理";
            break;
        case QNetworkReply::ProxyTimeoutError:
            errorMessage = "代理超时";
            break;
        case QNetworkReply::ProxyAuthenticationRequiredError:
            errorMessage = "代理需要认证";
            break;
        case QNetworkReply::ContentAccessDenied:
            errorMessage = "内容访问被拒绝";
            break;
        case QNetworkReply::ContentOperationNotPermittedError:
            errorMessage = "内容操作不被允许";
            break;
        case QNetworkReply::ContentNotFoundError:
            errorMessage = "内容未找到";
            break;
        case QNetworkReply::AuthenticationRequiredError:
            errorMessage = "需要认证";
            break;
        case QNetworkReply::ContentReSendError:
            errorMessage = "内容重新发送错误";
            break;
        case QNetworkReply::ContentConflictError:
            errorMessage = "内容冲突错误";
            break;
        case QNetworkReply::ContentGoneError:
            errorMessage = "内容已不存在";
            break;
        case QNetworkReply::InternalServerError:
            errorMessage = "服务器内部错误";
            break;
        case QNetworkReply::OperationNotImplementedError:
            errorMessage = "操作未实现";
            break;
        case QNetworkReply::ServiceUnavailableError:
            errorMessage = "服务不可用";
            break;
        case QNetworkReply::ProtocolUnknownError:
            errorMessage = "未知协议错误";
            break;
        case QNetworkReply::ProtocolInvalidOperationError:
            errorMessage = "协议无效操作";
            break;
        case QNetworkReply::UnknownProxyError:
            errorMessage = "未知代理错误";
            break;
        case QNetworkReply::UnknownContentError:
            errorMessage = "未知内容错误";
            break;
        case QNetworkReply::ProtocolFailure:
            errorMessage = "协议失败";
            break;
        // InvalidReplyError 在Qt 5.14.2中不存在，已移除
        case QNetworkReply::NoError:
            errorMessage = "无错误";
            break;
        default:
            errorMessage = QString("网络错误 (代码: %1)").arg(error);
            break;
    }
    
    statusLabel->setText("网络错误");
    addMessage(QString("网络错误: %1").arg(errorMessage), false);
}

// 清空对话历史
void Widget::clearHistory()
{
    chatDisplay->clear();
    conversationHistory = QJsonArray(); // 使用赋值方式清空QJsonArray
    addMessage("对话历史已清空，请问有什么可以帮助您的吗？", false);
}

// 添加消息到对话区域
void Widget::addMessage(const QString &message, bool isUser)
{
    QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss");
    QString formattedMessage;
    
    if (isUser) {
        formattedMessage = QString("<div style='margin: 10px 0; text-align: right;'>"
                                  "<div style='display: inline-block; max-width: 70%; background-color: #007bff; "
                                  "color: white; padding: 10px 15px; border-radius: 15px; text-align: left;'>"
                                  "<div style='font-weight: bold; margin-bottom: 5px;'>👤 您 (%1)</div>"
                                  "<div>%2</div>"
                                  "</div></div>")
                                  .arg(timestamp, message.toHtmlEscaped());
        
        // 添加到对话历史
        conversationHistory.append(QJsonObject{{"role", "user"}, {"content", message}});
    } else {
        formattedMessage = QString("<div style='margin: 10px 0; text-align: left;'>"
                                  "<div style='display: inline-block; max-width: 70%; background-color: #e9ecef; "
                                  "color: #495057; padding: 10px 15px; border-radius: 15px;'>"
                                  "<div style='font-weight: bold; margin-bottom: 5px;'>🤖 AI助手 (%1)</div>"
                                  "<div>%2</div>"
                                  "</div></div>")
                                  .arg(timestamp, message.toHtmlEscaped());
        
        // 添加到对话历史
        conversationHistory.append(QJsonObject{{"role", "assistant"}, {"content", message}});
    }
    
    // 添加到显示区域
    chatDisplay->append(formattedMessage);
    
    // 滚动到底部
    QTextCursor cursor = chatDisplay->textCursor();
    cursor.movePosition(QTextCursor::End);
    chatDisplay->setTextCursor(cursor);
}

// 解析API响应
QString Widget::parseApiResponse(const QByteArray &data)
{
    QJsonParseError error;
    QJsonDocument doc = QJsonDocument::fromJson(data, &error);
    
    if (error.error != QJsonParseError::NoError) {
        qDebug() << "JSON解析错误:" << error.errorString();
        return QString();
    }
    
    QJsonObject obj = doc.object();
    
    // 检查是否有错误
    if (obj.contains("error")) {
        QJsonObject errorObj = obj["error"].toObject();
        QString errorMessage = errorObj["message"].toString();
        qDebug() << "API错误:" << errorMessage;
        return QString("API错误: %1").arg(errorMessage);
    }
    
    // 解析响应内容
    if (obj.contains("choices") && obj["choices"].isArray()) {
        QJsonArray choices = obj["choices"].toArray();
        if (!choices.isEmpty()) {
            QJsonObject choice = choices.first().toObject();
            if (choice.contains("message")) {
                QJsonObject message = choice["message"].toObject();
                return message["content"].toString();
            }
        }
    }
    
    return QString();
}

// 生成模拟响应（当SSL不可用时使用）
QString Widget::generateMockResponse(const QString &message)
{
    // 创建一些基于关键词的模拟响应
    QString lowerMessage = message.toLower();
    
    if (lowerMessage.contains("你好") || lowerMessage.contains("hello")) {
        return "你好！我是智能问答助手。很高兴与您对话！\n\n注意：当前处于演示模式，因为SSL支持不可用。要使用真实的DeepSeek AI功能，请确保您的Qt环境支持OpenSSL。";
    }
    else if (lowerMessage.contains("什么") || lowerMessage.contains("介绍")) {
        return "我是一个基于Qt开发的智能问答助手，集成了DeepSeek AI API。\n\n功能特点：\n• 智能对话交互\n• 多轮对话支持\n• 现代化界面设计\n• 实时响应显示\n\n当前处于演示模式，实际功能需要SSL支持。";
    }
    else if (lowerMessage.contains("帮助") || lowerMessage.contains("help")) {
        return "我可以帮助您：\n\n1. 回答各种问题\n2. 进行日常对话\n3. 提供信息咨询\n4. 协助解决问题\n\n请注意：当前为演示模式，真实AI功能需要网络连接和SSL支持。您可以尝试输入任何问题来测试界面功能！";
    }
    else if (lowerMessage.contains("谢谢") || lowerMessage.contains("thank")) {
        return "不客气！很高兴能够帮助您。\n\n如果您有其他问题，随时可以继续提问。当SSL支持可用时，我将能够提供更智能和准确的回答。";
    }
    else if (lowerMessage.contains("再见") || lowerMessage.contains("bye")) {
        return "再见！感谢您使用智能问答助手。\n\n希望下次见面时能为您提供完整的AI功能体验！";
    }
    else {
        // 通用回复
        QStringList responses = {
            QString("您问的是：\"%1\"\n\n这是一个很有趣的问题！在演示模式下，我只能提供基本的交互功能。当SSL支持可用时，DeepSeek AI将为您提供更专业和详细的回答。").arg(message),
            QString("关于\"%1\"这个问题，我理解您的询问。\n\n目前处于演示模式，无法访问真实的AI服务。请确保您的Qt环境支持OpenSSL以获得完整功能。").arg(message),
            QString("您提到了\"%1\"，这确实是一个值得探讨的话题。\n\n在完整模式下，我将能够为您提供更深入和准确的分析。当前仅为界面功能演示。").arg(message)
        };
        
        // 随机选择一个回复
        int index = QDateTime::currentDateTime().toMSecsSinceEpoch() % responses.size();
        return responses[index];
    }
}
